package Model; public class Operations { /* * This class contains different operations that can be done on polynomials */ /* Addition of 2 polynomials */ public Polynomial addPolynomials(Polynomial p1, Polynomial p2) { int i; int[] addCoefficients; int diffLength = getDiffLength(p1.getDegree(), p2.getDegree()); if (p1.getDegree() > p2.getDegree()) { addCoefficients = new int[p1.getDegree() + 1];// maximum length for (i = 0; i < diffLength; i++) { addCoefficients[i] = p1.getThisCoeff(i); } for (i = diffLength; i <= p1.getDegree(); i++) { addCoefficients[i] = p1.getThisCoeff(i) + p2.getThisCoeff(i - diffLength); } } else { addCoefficients = new int[p2.getDegree() + 1]; for (i = 0; i < diffLength; i++) { addCoefficients[i] = p2.getThisCoeff(i); } for (i = diffLength; i <= p2.getDegree(); i++) { addCoefficients[i] = p2.getThisCoeff(i) + p1.getThisCoeff(i - diffLength); } } return new Polynomial(addCoefficients); } /* * Subtraction of 2 polynomials: Subtract the second one from the first one. */ public Polynomial subtractPolynomials(Polynomial p1, Polynomial p2) { int i; int[] subCoefficients; int diffLength = getDiffLength(p1.getDegree(), p2.getDegree()); if (p1.getDegree() >= p2.getDegree()) { subCoefficients = new int[p1.getDegree() + 1];// maximum length for (i = 0; i < diffLength; i++) { subCoefficients[i] = p1.getThisCoeff(i); } for (i = diffLength; i <= p1.getDegree(); i++) { subCoefficients[i] = p1.getThisCoeff(i) - p2.getThisCoeff(i - diffLength); } } else { subCoefficients = new int[p2.getDegree() + 1]; for (i = 0; i < diffLength; i++) { subCoefficients[i] = -p2.getThisCoeff(i); } for (i = diffLength; i <= p2.getDegree(); i++) { subCoefficients[i] = p1.getThisCoeff(i - diffLength) - p2.getThisCoeff(i); } } /* * else subCoefficients = new int[p1.getDegree() + 1]; for (i = 0; i * <= p1.getDegree(); i++) { //subCoefficients[i] = * p1.getThisCoeff(i) - p2.getThisCoeff(i); } */ return new Polynomial(subCoefficients); } /* Multiplication of two polynomials */ public Polynomial multiplyPolynomials(Polynomial p1, Polynomial p2) { int i, j; int[] mulCoefficients = new int[p1.getDegree() + p2.getDegree() + 1]; for (i = 0; i <= p1.getDegree(); i++) { for (j = 0; j <= p2.getDegree(); j++) { mulCoefficients[i + j] = mulCoefficients[i + j] + (p1.getThisCoeff(i) * p2.getThisCoeff(j)); } } return new Polynomial(mulCoefficients); } /* Division of two polynomials */ // work in progress........ public Polynomial dividePolynomials(Polynomial p1, Polynomial p2) { Polynomial bottom, middle; middle = p1; Polynomial end = new Polynomial(0, 0); int n = p1.getDegree() - p2.getDegree(); double[] coeff = new double[n + 1]; int i; for (i = 0; i <= n; i++) { coeff[i] = 0; } do { coeff[n] = middle.getThisCoeff(middle.getDegree()) / p2.getThisCoeff(p2.getDegree()); bottom = multiplyPolynomials(p2, new Polynomial(coeff[n], n)); middle = subtractPolynomials(middle, bottom); n--; } while (!middle.equals(end) && n >= 0); return new Polynomial(coeff); } /// last value is discarded, because it always equals 1 public Polynomial findDerivative(Polynomial p1) { int i; int[] derivativeCoeff = new int[p1.getDegree()]; for (i = 0; i < p1.getDegree(); i++) { derivativeCoeff[i] = p1.getThisCoeff(i) * (p1.getDegree() - i); } return new Polynomial(derivativeCoeff); } public double evaluatePolynomial(Polynomial p, double x) { double result = 0; int i; for (i = 0; i <= p.getDegree(); i++) { result += p.getThisCoeff(i) * Math.pow(x, p.getDegree() - i); } return result; } // working on it.. public Polynomial findIntegral(Polynomial p) { int[] integralCoeff = new int[p.getDegree() + 2]; for (int i = 0; i <= p.getDegree(); i++) { integralCoeff[i] = (p.getThisCoeff(i) / (i + p.getDegree() + 1)); } integralCoeff[p.getDegree() + 1] = 0; return new Polynomial(integralCoeff); } // return integral from a to b public double findDefiniteIntegral(double a, double b, Polynomial p) { Polynomial integral = findIntegral(p); return evaluatePolynomial(integral, b) - evaluatePolynomial(integral, a); } public int getDiffLength(int degree1, int degree2) { return Math.abs(degree1 - degree2); } public String toString(Polynomial p) { int degree = p.getDegree(); if (degree == -1) return "0"; if (degree == 0) return "" + p.getThisCoeff(0); if (degree == 1) return p.getThisCoeff(1) + "x + " + p.getThisCoeff(1); String s = p.getThisCoeff(degree) + "x^" + degree; for (int i = degree - 1; i >= 0; i--) { if (p.getThisCoeff(i) == 0) continue; else if (p.getThisCoeff(1) > 0) s = s + " + " + (p.getThisCoeff(1)); else if (p.getThisCoeff(1) < 0) s = s + " - " + (-p.getThisCoeff(1)); if (i == 1) s = s + "x"; else if (i > 1) s = s + "x^" + i; } return s; } }